package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * java反射机制
 * 反射机制是java的动态机制,它允许程序运行过程中再确定实例化对象,调用方法,操作属性等工作.
 * 这使得程序提高了灵活度,可以更好的适应程序运行后的某些多变环节的处理.
 * 反射会带来更多的系统消耗和较慢的运行效率,因此程序不能过度依赖反射,只在必要环节使用即可.
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            使用反射机制操作一个类时,我们需要获取该类的类对象,即:Class的一个实例
            JVM中每个被加载的类都有且只有一个类对象,通过类对象我们可以获取其表示的类的
            相关信息,比如:类名,有哪些方法,属性,构造器等.
            获取一个类的类对象方式有:
            1:类名.class
            例如:
            Class cls = String.class;获取String的类对象
            Class cls = int.class;获取int的类对象,注:基本类型只能这样获取类对象

            2:Class.forName(String className)
            Class提供了一个静态方法forName,用于加载并获取该类的类对象,传入的是要获取类的
            类名,这里必须是完全限定名,格式:包名.类名
            例如:
            Class cls = Class.forName("java.lang.String");

            3:使用类加载器ClassLoader获取

         */

//        Class cls = String.class;
//        Class cls = Person.class;

//        Class cls = Class.forName("java.lang.String");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类名:");
        String className = scanner.nextLine();
        /*
            java.lang.String
            java.io.FileInputStream
            reflect.Person
            java.util.HashSet
         */
        Class cls = Class.forName(className);

        String name = cls.getName();//获取类名(完全限定名:包名.类名)
        System.out.println(name);
        name = cls.getSimpleName();
        System.out.println(name);
        /*
            Method类的每一个实例用于表示一个方法
         */
        Method[] methods = cls.getMethods();
        for(Method m : methods){
            System.out.println(m.getName());
        }


    }
}
